
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>策略设计模式 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>策略设计模式 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">策略设计模式的核心定义是什么？它属于哪种类型的设计模式？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">策略设计模式是一种行为型设计模式，它允许在运行时选择算法的具体实现。该模式将一组算法封装成独立的类，并使它们可以互相替换，从而使算法的选择和使用可以灵活变化，而不影响客户端代码。</div>
          </div>
          <div class="card-source">来源: 策略设计模式：灵活地选择算法</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">策略设计模式通过哪些主要特点来实现算法的灵活选择与解耦？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主要特点有三点：1. 封装算法：将相关的算法封装到独立的策略类中，使它们可互换。2. 运行时选择：允许在程序运行时动态决定使用哪个具体算法。3. 减少耦合：将算法的具体实现与客户端代码分离开，降低了耦合度，提升了代码的可维护性。</div>
          </div>
          <div class="card-source">来源: 特点</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在哪些具体的业务场景下，使用策略设计模式会是一个好的选择？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">策略模式适用于以下场景：1. 当有多种相关的算法可供选择时，可以动态切换。2. 为了避免代码中出现大量的条件判断语句（如if-else）。3. 当系统需要良好的扩展性，可以轻松添加新算法而无需修改现有代码时。</div>
          </div>
          <div class="card-source">来源: 使用场景</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">请举例说明策略设计模式在Java或Spring框架中的具体应用。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在Java中，`Collections.sort()` 方法允许传入一个 `Comparator`（比较器），这个比较器就扮演了策略的角色，用于动态地改变排序算法。在Spring框架中，数据源选择、事务管理等许多模块都运用了策略模式来提供不同的实现。</div>
          </div>
          <div class="card-source">来源: 框架中的应用</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在文档提供的日志记录代码示例中，`LoggingStrategy` 接口扮演了什么角色？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">`LoggingStrategy` 接口定义了所有具体日志策略（如控制台日志和文件日志）必须遵守的公共契约。它使得 `Logger` 类可以面向接口编程，而不是具体的实现类，从而实现了 `Logger` 与具体日志记录算法的解耦。</div>
          </div>
          <div class="card-source">来源: 实现示例</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">策略模式如何提升代码的扩展性？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">策略模式通过将算法封装在独立的策略类中，并让它们实现一个公共接口，从而提升了扩展性。当需要添加新的算法时，只需创建一个新的策略类实现该接口即可，而不需要修改使用这些算法的客户端或上下文（Context）代码，符合开闭原则。</div>
          </div>
          <div class="card-source">来源: 使用场景</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
